void gdk_window_freeze_toplevel_updates (GdkWindow *window);
void gdk_window_thaw_toplevel_updates (GdkWindow *window);
+gboolean gdk_window_supports_edge_constraints (GdkWindow *window);
+
GdkRenderingMode gdk_display_get_rendering_mode (GdkDisplay *display);
void gdk_display_set_rendering_mode (GdkDisplay *display,
GdkRenderingMode mode);
else
return FALSE;
}
+
+gboolean
+gdk_window_supports_edge_constraints (GdkWindow *window)
+{
+ GdkWindowImplClass *impl_class;
+
+ g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
+ g_return_val_if_fail (!GDK_WINDOW_DESTROYED (window), FALSE);
+
+ impl_class = GDK_WINDOW_IMPL_GET_CLASS (window->impl);
+
+ if (impl_class->supports_edge_constraints)
+ return impl_class->supports_edge_constraints (window);
+ else
+ return FALSE;
+}
gboolean attached,
GdkGLContext *share,
GError **error);
+ gboolean (* supports_edge_constraints)(GdkWindow *window);
};
/* Interface Functions */
return TRUE;
}
+static gboolean
+gdk_wayland_window_supports_edge_constraints (GdkWindow *window)
+{
+ GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
+
+ return gtk_surface1_get_version (impl->display_server.gtk_surface) > GTK_SURFACE1_CONFIGURE_EDGES_SINCE_VERSION;
+}
+
static void
_gdk_window_impl_wayland_class_init (GdkWindowImplWaylandClass *klass)
{
impl_class->set_shadow_width = gdk_wayland_window_set_shadow_width;
impl_class->show_window_menu = gdk_wayland_window_show_window_menu;
impl_class->create_gl_context = gdk_wayland_window_create_gl_context;
+ impl_class->supports_edge_constraints = gdk_wayland_window_supports_edge_constraints;
signals[COMMITTED] = g_signal_new ("committed",
G_TYPE_FROM_CLASS (object_class),
{
GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (window);
GdkWindowState local_set, local_unset;
- GdkScreen *screen = GDK_WINDOW_SCREEN (window);
guint edge_constraints;
local_set = *set;
* implementation. If it supports _GTK_EDGE_CONSTRAINTS, however, remove
* the GDK_WINDOW_STATE_TILED flag explicitly.
*/
- if (!gdk_x11_screen_supports_net_wm_hint (screen,
- gdk_atom_intern_static_string ("_GTK_EDGE_CONSTRAINTS")))
+ if (!gdk_window_supports_edge_constraints (window))
{
/* FIXME: we rely on implementation details of mutter here:
* mutter only tiles horizontally, and sets maxvert when it does
*unscaled_height = impl->unscaled_height;
}
+static gboolean
+gdk_x11_window_supports_edge_constraints (GdkWindow *window)
+{
+ return gdk_x11_screen_supports_net_wm_hint (GDK_WINDOW_SCREEN (window),
+ gdk_atom_intern_static_string ("_GTK_EDGE_CONSTRAINTS"));
+}
+
static void
set_sync_counter(Display *display,
XSyncCounter counter,
impl_class->show_window_menu = gdk_x11_window_show_window_menu;
impl_class->create_gl_context = gdk_x11_window_create_gl_context;
impl_class->get_unscaled_size = gdk_x11_window_get_unscaled_size;
+ impl_class->supports_edge_constraints = gdk_x11_window_supports_edge_constraints;
}
GtkStyleContext *context;
gint handle_v, handle_h;
GtkBorder border;
+ gboolean supports_edge_constraints;
if (priv->type != GTK_WINDOW_TOPLEVEL ||
!priv->client_decorated ||
priv->maximized)
return FALSE;
- if (priv->tiled && !priv->edge_constraints)
+ supports_edge_constraints = gdk_window_supports_edge_constraints (_gtk_widget_get_window (GTK_WIDGET (window)));
+
+ if (!supports_edge_constraints && priv->tiled)
+ return FALSE;
+
+ if (supports_edge_constraints &&
+ !(priv->edge_constraints & GDK_WINDOW_STATE_TOP_RESIZABLE) &&
+ !(priv->edge_constraints & GDK_WINDOW_STATE_RIGHT_RESIZABLE) &&
+ !(priv->edge_constraints & GDK_WINDOW_STATE_BOTTOM_RESIZABLE) &&
+ !(priv->edge_constraints & GDK_WINDOW_STATE_LEFT_RESIZABLE))
return FALSE;
_gtk_widget_get_allocation (GTK_WIDGET (window), &allocation);
edge != GDK_WINDOW_EDGE_SOUTH_WEST)
return FALSE;
- if (!(priv->edge_constraints & GDK_WINDOW_STATE_LEFT_RESIZABLE))
+ if (supports_edge_constraints &&
+ !(priv->edge_constraints & GDK_WINDOW_STATE_LEFT_RESIZABLE))
return FALSE;
}
else if (x >= allocation.x + allocation.width - border.right - handle_h)
edge != GDK_WINDOW_EDGE_SOUTH_EAST)
return FALSE;
- if (!(priv->edge_constraints & GDK_WINDOW_STATE_RIGHT_RESIZABLE))
+ if (supports_edge_constraints &&
+ !(priv->edge_constraints & GDK_WINDOW_STATE_RIGHT_RESIZABLE))
return FALSE;
}
else if (edge != GDK_WINDOW_EDGE_NORTH &&
edge != GDK_WINDOW_EDGE_NORTH_EAST)
return FALSE;
- if (!(priv->edge_constraints & GDK_WINDOW_STATE_TOP_RESIZABLE))
+ if (supports_edge_constraints &&
+ !(priv->edge_constraints & GDK_WINDOW_STATE_TOP_RESIZABLE))
return FALSE;
}
else if (y > allocation.y + allocation.height - border.bottom - handle_v)
edge != GDK_WINDOW_EDGE_SOUTH_EAST)
return FALSE;
- if (!(priv->edge_constraints & GDK_WINDOW_STATE_BOTTOM_RESIZABLE))
+ if (supports_edge_constraints &&
+ !(priv->edge_constraints & GDK_WINDOW_STATE_BOTTOM_RESIZABLE))
return FALSE;
}
else if (edge != GDK_WINDOW_EDGE_WEST &&